package com.sjms._12_行为_代理模式._3_Cglib代理;

/**
 * 代理模式
 * 在开发者的角度来看，创建一个代理对象，提供给用户使用，避免用户直接访问真正的对象
 * 在用户角度来看，就是普通的类方法调用
 * <p>
 * 作用
 * 1.保护被代理对象
 * 2.增强被代理对象
 * 3.完全替换被代理对象
 * <p>
 * Cglib代理（子类代理）
 * 可以在运行期，扩展java类与实现接口，在内存中创建一个子类对象，实现代理功能
 * 底层通过字节码处理框架ASM,转换字节码并生成新的类
 * 被代理类都不需要实现接口
 * 代理类需要实现 MethodInterceptor（方法拦截器）
 * <p>
 * 1.创建被代理类、创建代理类、代理类内部聚合被代理类
 * 2.创建返回代理类实例方法  Enhancer.create(object.getClass(), this);
 * (1.创建工具类，2.设置工具类的父类为被代理类 3.设计监听回调为当前this 4.return 创建代理类实例对象)
 * 3.实现接口方法（调用 method.invoke() ,返回结果）
 * 4.客户端，（1.创建被代理对象，传进代理对象，强转    2.调用方法）
 * <p>
 * 代码示例：《帮爸爸买菜》
 * 1.父亲
 * 2.儿子，接收被代理对象，返回代理对象，在方法拦截回调中，处理逻辑
 * <p>
 * import net.sf.cglib.proxy.Enhancer;
 * import net.sf.cglib.proxy.MethodInterceptor;
 * import net.sf.cglib.proxy.MethodProxy;
 */
public class _Test_Mom {

    public static void main(String[] args) {
        System.out.println("妈妈：他爸!!!去买点菜");
        Father father = new Father();

        //儿子 构建 代理爸爸
        Son son = new Son();
        son.setTarget(father);
        Father proxyFather = (Father) son.getProxy();

        //
        String buy = proxyFather.buy();
        System.out.println(buy);

    }

}
